﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; using Montana.Entidades;

namespace Montana
{
    public partial class frmProducto : Form
    {
        bool modificando = false;
        string codigoOriginal = "";
        int idActual;

        public frmProducto()
        {
            InitializeComponent();
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            if (!Validar())
                return;

            Producto o = new Producto();
            ArmarObjeto(o);

            if (modificando)
                o.Modificar();
            else
                o.Nuevo();
            
            modificando = false;
            this.Tag = null;

            Limpiar();

            txtCodigo.Focus();

            System.Threading.Thread.Sleep(500);
            CargarLista();            
        }

        private void ArmarObjeto(Producto o)
        {
            o.ID = idActual;
            o.Codigo = txtCodigo.Text;
            o.Nombre = txtNombre.Text;
            o.Descripcion = txtDescripcion.Text;
            o.IDTipoproducto = Validacion.GetValue(cboCategoria);
            o.IDFamiliaproducto = Validacion.GetValue(cboFamilia);
            o.IDUnidad = Validacion.GetValue(cboUnidad);

            o.Preciooriginal = Validacion.ValDecimal(txtPrecio);
            o.Preciomanoobra = Validacion.ValDecimal(txtPrecioManoObra);

            o.Stock = Validacion.ValDecimal(txtStock);
        }

        private bool Validar()
        {
            if (Validacion.EstaVacio(txtCodigo, "Debe ingresar el código"))
                return false;

            if (Validacion.EstaVacio(txtNombre, "Debe ingresar el nombre"))
                return false;

            if (Validacion.EstaVacio(cboCategoria, "Debe ingresar la categoría"))
                return false;

            if (Validacion.EstaVacio(cboFamilia, "Debe ingresar la familia"))
                return false;

            if (Validacion.EstaVacio(cboUnidad, "Debe ingresar la unidad"))
                return false;

            if (!modificando || codigoOriginal != txtCodigo.Text)
            {
                Producto cli = new Producto();
                if (cli.ExisteCodigo(txtCodigo.Text))
                {
                    Validacion.MostrarError(txtCodigo, "El código ingresado ya existe");
                    return false;
                }
            }

            return true;
        }

        private void frmProducto_Load(object sender, EventArgs e)
        {
            CrearColumnas();

            CargarLista();

            TipoProducto tp = new TipoProducto();
            tp.CargarCombo(cboCategoria, true);

            Unidad u = new Unidad();
            u.CargarCombo(cboUnidad, true);
        }

        private void CrearColumnas()
        {
            lswLista.Columns.Add("Código", 90);
            lswLista.Columns.Add("Nombre", 150);
            lswLista.Columns.Add("Descripción", 180);
            lswLista.Columns.Add("Categoría", 120);
            lswLista.Columns.Add("Familia", 180);
            lswLista.Columns.Add("Precio", 80, HorizontalAlignment.Right);
            lswLista.Columns.Add("Peso", 80, HorizontalAlignment.Right);
            lswLista.Columns.Add("Precio mano de obra", 140, HorizontalAlignment.Right);
            lswLista.Columns.Add("Stock actual", 90, HorizontalAlignment.Right);
            lswLista.Columns.Add("Unidad", 130);
        }

        private void CargarLista()
        {
            Producto o = new Producto();
            List<Producto> items;

            if (txtBuscar.Text.Trim() == "")
                items = o.TraerTodos();
            else
                items = o.BuscarPorNombreDescripcion(txtBuscar.Text);

            CargarLista(items);
        }

        private void CargarLista(List<Producto> items)
        {
            lswLista.Items.Clear();
            foreach (Producto item in items)
            {
                lswLista.Items.Add(item.Codigo);
                lswLista.Items[lswLista.Items.Count - 1].Tag = item;

                lswLista.Items[lswLista.Items.Count - 1].SubItems.Add(item.Nombre);
                lswLista.Items[lswLista.Items.Count - 1].SubItems.Add(item.Descripcion);
                lswLista.Items[lswLista.Items.Count - 1].SubItems.Add(item.Tipoproducto);
                lswLista.Items[lswLista.Items.Count - 1].SubItems.Add(item.Familiaproducto);
                lswLista.Items[lswLista.Items.Count - 1].SubItems.Add(item.PrecioOriginalFormato);
                lswLista.Items[lswLista.Items.Count - 1].SubItems.Add(item.Peso.ToString("0.00"));
                lswLista.Items[lswLista.Items.Count - 1].SubItems.Add(item.PrecioManoObraFormato);
                lswLista.Items[lswLista.Items.Count - 1].SubItems.Add(item.StockFormato);
                lswLista.Items[lswLista.Items.Count - 1].SubItems.Add(item.Unidad);
            }
        }

        private void frmProducto_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.Escape:
                    btnCerrar_Click(this, null);
                    break;
                case Keys.F1:
                    txtCodigo.Focus();
                    break;
                case Keys.F2:
                    break;
                case Keys.F3:
                    txtBuscar.Focus();
                    break;
            }
        }

        private void btnCerrar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnBorrar_Click(object sender, EventArgs e)
        {
            if (lswLista.SelectedItems.Count == 0)
                return;

            DialogResult res = Validacion.MostrarMensaje("¿Borrar el producto \"" + txtNombre.Text + "\"?", TipoMensaje.Pregunta);

            if (res == DialogResult.No)
                return;

            Producto o = new Producto();
            o = (Producto)this.Tag;
            o.Borrar(o.ID);

            Limpiar();

            CargarLista();

            txtCodigo.Focus();
        }

        private void Limpiar()
        {
            txtCodigo.Text = "";
            txtNombre.Text = "";
            txtDescripcion.Text = "";
            cboCategoria.SelectedIndex = 0;
            cboUnidad.SelectedIndex = 0;
            txtPrecio.Text = "";
            txtPrecioManoObra.Text = "";
            txtStock.Text = "";
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            Limpiar();

            modificando = false;

            txtCodigo.Focus();
        }

        private void lswLista_Click(object sender, EventArgs e)
        {
            if (lswLista.SelectedItems.Count == 0)
                return;

            Producto o = (Producto)lswLista.SelectedItems[0].Tag;
            this.Tag = o;

            Limpiar();

            codigoOriginal = o.Codigo;
            modificando = true;

            idActual = o.ID;
            codigoOriginal = o.Codigo;            
            txtCodigo.Text = o.Codigo;
            txtNombre.Text = o.Nombre;
            txtDescripcion.Text = o.Descripcion;
            cboCategoria.SelectedValue = o.IDTipoproducto.ToString();
            cboFamilia.SelectedValue = o.IDFamiliaproducto.ToString();
            cboUnidad.SelectedValue = o.IDUnidad.ToString();
            txtStock.Text = o.StockFormato;
            txtPrecio.Text = o.PrecioOriginalFormato;
            txtPrecioManoObra.Text = o.PrecioManoObraFormato;
        }

        private void txtBuscar_TextChanged(object sender, EventArgs e)
        {
            CargarLista();
        }

        private void lswLista_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.Delete:
                    btnBorrar_Click(this, null);
                    break;
            }
        }

        private void cboCategoria_SelectedIndexChanged(object sender, EventArgs e)
        {
            FamiliaProducto f = new FamiliaProducto();
            int idTipoProducto = Validacion.GetValue(cboCategoria);

            f.CargarCombo(cboFamilia, f.BuscarPorTipoProducto(idTipoProducto), true);

            if (cboFamilia.Items.Count == 2) 
            {
                cboFamilia.SelectedIndex = 1;
            }
        }
    }
}
